package org.nf.web.invoke;

import cn.hutool.core.util.ReflectUtil;
import org.nf.web.servlet.Controller;
import org.nf.web.servlet.HandlerInvoke;
import org.nf.web.servlet.ServletApi;

/**
 * 负责调用 Controller 方法处理请求
 *
 * @author zhu
 * @date 2024-05-15
 */
public class ClassHandlerInvoke implements HandlerInvoke {

    @Override
    public boolean supports(Object handler) {
        //如果handler是Class的实例，
        // 则强转为Class对象用一个clazz变量声明
        if(handler instanceof Class clazz) {
            //判断是否有实现Controller接口
            if(Controller.class.isAssignableFrom(clazz)) {
                return true;
            }
        }
        return false;
    }

    @Override
    public Object invoke(Object handler, ServletApi servletApi) {
        // 现将handler转换为Controller的class的对象
        // 注意：不能调用handler.getClass()方法来转换，因为这个方法得到的Class对象就是当前类的Class
        Class<?> clazz = (Class<?>)handler;
        // 创建Controller的实例
        Controller instance = (Controller) ReflectUtil.newInstance(clazz);
        // 调用execute方法处理请求
        instance.execute(servletApi.req(), servletApi.resp());

        return null;
    }
}
